bitkeeper revision 1.118 (3e6c9011AqlyQcEHaXEFaZYbfVfgPQ)
authorkaf24@labyrinth.cl.cam.ac.uk <kaf24@labyrinth.cl.cam.ac.uk>
Mon, 10 Mar 2003 13:16:01 +0000 (13:16 +0000)
committerkaf24@labyrinth.cl.cam.ac.uk <kaf24@labyrinth.cl.cam.ac.uk>
Mon, 10 Mar 2003 13:16:01 +0000 (13:16 +0000)
Many files:
  Fixed Xen blkdev probing to return device numbers.

xen/drivers/block/xen_block.c
xen/drivers/block/xen_segment.c
xen/drivers/ide/ide-xeno.c
xen/drivers/scsi/sd.c
xen/include/hypervisor-ifs/block.h
xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/block/xl_ide.c
xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/block/xl_scsi.c
xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/block/xl_segment.c

index 43b85fe6d319b08ad772434602d5f844cff9107e..bf9cfd7431034600f15ab7e25fc297cad97aad6d 100644 (file)
@@ -482,7 +482,8 @@ static void dispatch_probe_blk(struct task_struct *p, int index)
 
 static void dispatch_probe_seg(struct task_struct *p, int index)
 {
-    extern void xen_segment_probe(xen_disk_info_t *xdi);
+    extern void xen_segment_probe(struct task_struct *, xen_disk_info_t *);
+
     blk_ring_t *blk_ring = p->blk_ring_base;
     xen_disk_info_t *xdi;
     unsigned long flags, buffer;
@@ -502,7 +503,7 @@ static void dispatch_probe_seg(struct task_struct *p, int index)
     spin_unlock_irqrestore(&p->page_lock, flags);
 
     xdi = phys_to_virt(buffer);
-    xen_segment_probe(xdi);
+    xen_segment_probe(p, xdi);
 
     unlock_buffer(p, buffer, sizeof(xen_disk_info_t), 1);
 
index e644aad1150ab835e3029a34ea9d655430b15563..4a09f511a6d0b73a1c00a3d2b4a3ba1004f5fbe7 100644 (file)
@@ -97,27 +97,28 @@ int xen_segment_map_request(
  *
  * return a list of segments to the guestos
  */
-void xen_segment_probe (xen_disk_info_t *raw_xdi, int *count)
+void xen_segment_probe(struct task_struct *p, xen_disk_info_t *raw_xdi)
 {
     int loop, i;
     xen_disk_info_t *xdi = map_domain_mem(virt_to_phys(raw_xdi));
 
-    for (loop = 0; loop < XEN_MAX_SEGMENTS; loop++ )
+    for ( loop = 0; loop < XEN_MAX_SEGMENTS; loop++ )
     {
-        if (xsegments[loop].mode != XEN_SEGMENT_UNUSED)
+        if ( (xsegments[loop].mode == XEN_SEGMENT_UNUSED) ||
+             (xsegments[loop].domain != p->domain) )
+            continue;
+
+        xdi->disks[xdi->count].device = 
+            MK_VIRTUAL_XENDEV(xsegments[loop].segment_number);
+        for ( i = 0; i < xsegments[loop].num_extents; i++ )
         {
-            xdi->disks[xdi->count].type = XEN_DISK_VIRTUAL;
-            for (i = 0; i < xsegments[loop].num_extents; i++)
-            {
-                xdi->disks[xdi->count].capacity += 
-                    xsegments[loop].extents[i].size;
-            }
-            xdi->count++;
+            xdi->disks[xdi->count].capacity += 
+                xsegments[loop].extents[i].size;
         }
+        xdi->count++;
     }
 
     unmap_domain_mem(xdi);
-    return;
 }
 
 /*
@@ -132,14 +133,13 @@ void xen_refresh_segment_list (struct task_struct *p)
 
     for (loop = 0; loop < XEN_MAX_SEGMENTS; loop++)
     {
-        if (xsegments[loop].mode != XEN_SEGMENT_UNUSED &&
-            xsegments[loop].domain == p->domain)
-        {
-            p->segment_list[xsegments[loop].segment_number] = &xsegments[loop];
-            p->segment_count++;
-        }
+        if ( (xsegments[loop].mode == XEN_SEGMENT_UNUSED) ||
+             (xsegments[loop].domain != p->domain) )
+            continue;
+
+        p->segment_list[xsegments[loop].segment_number] = &xsegments[loop];
+        p->segment_count++;
     }
-    return;
 }
 
 /*
index b5bca9b5c9b962d1ac81ddbc87b4553e8f39f595..49ecde74e4ac76d44bc8a7bd88f7d02cc48eef20 100644 (file)
@@ -26,7 +26,8 @@ void ide_probe_devices(xen_disk_info_t* xdi)
             if ( !drive->present ) continue;
             
             capacity = current_capacity(drive);
-            xen_xdi->disks[xen_xdi->count].type = XEN_DISK_IDE;
+            xen_xdi->disks[xen_xdi->count].device =
+                MK_IDE_XENDEV((loop * MAX_DRIVES) + unit);
             xen_xdi->disks[xen_xdi->count].capacity = capacity;
             xen_xdi->count++;
 
index 71e9e4409fa7fb6ff450b1c3e82e1561164a3fec..a2a245fddc94ffc0ebe7c774d32ea4a760006713 100644 (file)
@@ -1325,7 +1325,7 @@ void scsi_probe_devices(xen_disk_info_t *xdi)
     {
         if ( sd->device == NULL ) continue;
 
-        xen_xdi->disks[xen_xdi->count].type = XEN_DISK_SCSI; 
+        xen_xdi->disks[xen_xdi->count].device   = MK_SCSI_XENDEV(i);
         xen_xdi->disks[xen_xdi->count].capacity = sd->capacity; 
         xen_xdi->count++; 
                 
index 1b228c5c8542e1d87782346159aacb2dcd4b2166..a4b9f35376af7b31f8e83321adcd089bcdee1a69 100644 (file)
 #define XENDEV_SCSI           (2 << XENDEV_TYPE_SHIFT)
 #define XENDEV_VIRTUAL        (3 << XENDEV_TYPE_SHIFT)
 
+#define IS_IDE_XENDEV(_d)     (((_d) & XENDEV_TYPE_MASK) == XENDEV_IDE)
+#define IS_SCSI_XENDEV(_d)    (((_d) & XENDEV_TYPE_MASK) == XENDEV_SCSI)
+#define IS_VIRTUAL_XENDEV(_d) (((_d) & XENDEV_TYPE_MASK) == XENDEV_VIRTUAL)
+
 #define MK_IDE_XENDEV(_i)     ((_i) | XENDEV_IDE)
 #define MK_SCSI_XENDEV(_i)    ((_i) | XENDEV_SCSI)
 #define MK_VIRTUAL_XENDEV(_i) ((_i) | XENDEV_VIRTUAL)
@@ -90,19 +94,15 @@ typedef struct blk_ring_st
 
 #define XEN_MAX_DISK_COUNT 100
 
-#define XEN_DISK_IDE  1
-#define XEN_DISK_SCSI 2
-#define XEN_DISK_VIRTUAL 3                                            /* vhd */
-
-typedef struct xen_disk                                     /* physical disk */
+typedef struct xen_disk
 {
-  int           type;                                           /* disk type */
-  unsigned long capacity;
+    unsigned short device;
+    unsigned long  capacity;
 } xen_disk_t;
 
 typedef struct xen_disk_info
 {
-  int         count;            /* number of xen_disk_t structures to follow */
+  int         count;
   xen_disk_t  disks[XEN_MAX_DISK_COUNT];
 } xen_disk_info_t;
 
index 9d6ef64c75394228ca263a7c0d17d4e8be9ee6e9..70990167e3f6c0134ff369b18aa2d36f8bc8e0b6 100644 (file)
@@ -73,13 +73,16 @@ int xlide_init(xen_disk_info_t *xdi)
      */
     blk_queue_headactive(BLK_DEFAULT_QUEUE(XLIDE_MAJOR), 0);
 
-    /* Count number of IDE devices installed in the system. */
+    /* If we don't have any usable IDE devices we may as well bail now. */
     units = 0;
     for ( i = 0; i < xdi->count; i++ )
-        if ( xdi->disks[i].type == XEN_DISK_IDE ) units++;
-
+        if ( IS_IDE_XENDEV(xdi->disks[i].device) &&
+             ((xdi->disks[i].device & XENDEV_IDX_MASK) < 16) ) units++;
     if ( units == 0 ) return 0;
 
+    /* We may register up to 16 devices in a sparse identifier space. */
+    units = 16;
+
     /* Construct an appropriate gendisk structure. */
     minors    = units * (1<<IDE_PARTN_BITS);
     gd        = kmalloc(sizeof(struct gendisk), GFP_KERNEL);
@@ -104,10 +107,13 @@ int xlide_init(xen_disk_info_t *xdi)
     add_gendisk(gd);
     
     /* Now register each disk in turn. */
-    disk = 0;
     for ( i = 0; i < xdi->count; i++ )
     {
-        if ( xdi->disks[i].type != XEN_DISK_IDE ) continue;
+        disk = xdi->disks[i].device & XENDEV_IDX_MASK;
+
+        /* We can use the first 16 IDE devices. */
+        if ( !IS_IDE_XENDEV(xdi->disks[i].device) || (disk >= 16) ) continue;
+
         ((xl_disk_t *)gd->real_devices)[disk].capacity =
             xdi->disks[i].capacity;
         register_disk(gd, 
@@ -115,7 +121,6 @@ int xlide_init(xen_disk_info_t *xdi)
                       1<<IDE_PARTN_BITS, 
                       &xlide_block_fops, 
                       xdi->disks[i].capacity);
-        disk++;
     }
 
     printk(KERN_ALERT 
index 68566799bd586b541efd253aa01c7698cba0a9ce..75e379f1bac158f4535e397f1fbe84d4a023814a 100644 (file)
@@ -74,13 +74,16 @@ int xlscsi_init(xen_disk_info_t *xdi)
      */
     blk_queue_headactive(BLK_DEFAULT_QUEUE(XLSCSI_MAJOR), 0);
 
-    /* Count number of SCSI devices installed in the system. */
+    /* If we don't have any usable SCSI devices we may as well bail now. */
     units = 0;
     for ( i = 0; i < xdi->count; i++ )
-        if ( xdi->disks[i].type == XEN_DISK_SCSI ) units++;
-
+        if ( IS_SCSI_XENDEV(xdi->disks[i].device) &&
+             ((xdi->disks[i].device & XENDEV_IDX_MASK) < 16) ) units++;
     if ( units == 0 ) return 0;
 
+    /* We may register up to 16 devices in a sparse identifier space. */
+    units = 16;
+
     /* Construct an appropriate gendisk structure. */
     minors    = units * (1<<SCSI_PARTN_BITS);
     gd        = kmalloc(sizeof(struct gendisk), GFP_KERNEL);
@@ -105,10 +108,13 @@ int xlscsi_init(xen_disk_info_t *xdi)
     add_gendisk(gd);
 
     /* Now register each disk in turn. */
-    disk = 0;
     for ( i = 0; i < xdi->count; i++ )
     {
-        if ( xdi->disks[i].type != XEN_DISK_SCSI ) continue;
+        disk = xdi->disks[i].device & XENDEV_IDX_MASK;
+
+        /* We can use the first 16 IDE devices. */
+        if ( !IS_SCSI_XENDEV(xdi->disks[i].device) || (disk >= 16) ) continue;
+
         ((xl_disk_t *)gd->real_devices)[disk].capacity =
             xdi->disks[i].capacity;
         register_disk(gd,
@@ -116,7 +122,6 @@ int xlscsi_init(xen_disk_info_t *xdi)
                       1<<SCSI_PARTN_BITS, 
                       &xlscsi_block_fops, 
                       xdi->disks[i].capacity);
-        disk++;
     }
    
     printk(KERN_ALERT 
index 97a53fe6fd82dc6e829834d3ecf0f396702ba4c1..8626a3656991f136e06ea38b77e77d7434eb8cfa 100644 (file)
@@ -90,13 +90,12 @@ int __init xlseg_init(void)
      */
     blk_queue_headactive(BLK_DEFAULT_QUEUE(XLVIRT_MAJOR), 0);
 
-
-    /* Count number of virtual devices installed in the system. */
-    units = 0;
-    for ( i = 0; i < xdi->count; i++ )
-        if ( xdi->disks[i].type == XEN_DISK_VIRTUAL ) units++;
-
-    if ( units == 0 ) return 0;
+    /*
+     * We may register up to 16 devices in a sparse identifier space.
+     * Unlike with IDE and SCSI, we always register a gendisk, as new
+     * virtual devices may get allocate dto us later on.
+     */
+    units = 16;
 
     /* Construct an appropriate gendisk structure. */
     minors    = units * (1<<VIRT_PARTN_BITS);
@@ -122,10 +121,14 @@ int __init xlseg_init(void)
     add_gendisk(gd);
 
     /* Now register each disk in turn. */
-    disk = 0;
     for ( i = 0; i < xdi->count; i++ )
     {
-        if ( xdi->disks[i].type != XEN_DISK_VIRTUAL ) continue;
+        disk = xdi->disks[i].device & XENDEV_IDX_MASK;
+
+        /* We can use the first 16 IDE devices. */
+        if ( !IS_VIRTUAL_XENDEV(xdi->disks[i].device) || (disk >= 16) )
+            continue;
+
         ((xl_disk_t *)gd->real_devices)[disk].capacity =
             xdi->disks[i].capacity;
         register_disk(gd, 
@@ -133,7 +136,6 @@ int __init xlseg_init(void)
                       1<<VIRT_PARTN_BITS, 
                       &xlsegment_block_fops, 
                       xdi->disks[i].capacity);
-        disk++;
     }
 
     printk(KERN_ALERT